import Analise
import wave
import numpy as np

#TODO
#class App:

#Classe responsavel pelas operacoes de comunicacao com o modulo Analise
class Analisador:
    #Parametros: nome_arquivo, uma string contendo o nome de um arquivo de audio
    #Caso ocorra algum erro na leitura do arquivo de audio, se retornara uma
    #string com a mensagem de erro.
    def __init__(self,nome_arquivo):
        try:
            self.audio=Analise.Audio(nome_arquivo)
        except wave.Error:
            return "Formato nao aceito"
        self.analise = Analise.Analise(self.audio)
    #responsavel pela operacao de analise de nota
    #Parametros: wintype, uma string descrevendo o tipo de janela
    #            winvalue, um inteiro contendo o numero de itens da janela
    #            overlap, um numero contendo o valor do overlap da STFT
    #retorna: o resultado da operacao de analise, uma tupla contendo
    #a nota reconhecida e o espectrograma analisado
    def analisa_nota(self,wintype,winvalue,overlap):
        win = self.__constroi_janela(wintype,winvalue)
        return self.analise.analisa_nota(window=win,overlap=overlap)
    #responsavel pela operacao de analise de acorde
    #retorna: um objeto do tipo Acorde e um objeto do tipo Histograma
    def analisa_acorde(self):
        return self.analise.analisa_acorde()
    #responsavel pela operacao de analise de tonalidade
    #Parametros: wintype, uma string descrevendo o tipo de janela
    #            winvalue, um inteiro contendo o numero de itens da janela
    #            overlap, um numero contendo o valor do overlap da STFT
    #retorna: o resultado da operacao de analise, uma tupla contendo
    #a tonalidade reconhecida e o espectrograma analisado
    def analisa_tonalidade(self,wintype,winvalue,overlap):
        win = self.__constroi_janela(wintype,winvalue)
        return self.analise.analisa_tonalidade(window=win,overlap=overlap)
    #retorna o espectro do arquivo de audio analisado
    def analisa_espectro(self):
        return self.analise.analisa_espectro()
    #funcao auxiliar que constroi janelas para STFT
    #Parametros: wintype, uma string descrevendo o tipo de janela
    #            winvalue, um inteiro contendo o numero de itens da janela
    def __constroi_janela(self,wintype,winvalue):
        #who needs switch when you got dictionaries
        tipo = {'rectangular':np.ones,
                'hanning':np.hanning,
                'hamming':np.hamming,
                'blackman':np.blackman,
               }
        return tipo[wintype](winvalue)

if __name__=="__main__":
    #blablabla
    a=0
